package com.atguigu.service.impl;

import com.atguigu.annotations.MyRedisCache;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.entity.User;
import com.atguigu.service.UserService;
import com.atguigu.mapper.UserMapper;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.io.Serializable;

/**
 * @author 刘
 * @description 针对表【t_user(用户表)】的数据库操作Service实现
 * @createDate 2025-08-05 19:02:26
 */
@Slf4j
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
        implements UserService {
    public static final String CACHE_KEY_USER = "user:";

    @Resource
    private UserMapper userMapper;
    @Resource
    private RedisTemplate<String, Object> redisTemplate;

        /**
     * 保存用户信息
     * @param user 用户对象
     * @return 保存成功返回true，否则返回false
     */
    @Override
    public boolean save(User user) {
        // 声明一个布尔变量retValue用于存储保存操作的结果，默认初始化为false表示保存失败
        boolean retValue=false;

        // 在执行保存操作之前，记录用户信息到日志中，用于调试和监控
        log.info("插入之前user:{}", user);

        // 调用父类ServiceImpl的save方法执行实际的数据库插入操作
        retValue= super.save(user);

        // 在执行保存操作之后，再次记录用户信息到日志中，此时用户对象可能包含数据库生成的ID
        log.info("插入之后user:{}", user);

        // 打印分隔线到日志中，用于区分不同的操作记录
        log.info("================================");

        // 判断保存操作是否成功（retValue为true表示保存成功）
        if(retValue){
            // 保存成功后，根据用户ID重新从数据库查询完整的用户信息
            // 这样可以确保获取到数据库生成的ID和其他默认字段值
            user=this.userMapper.selectById(user.getId());

            // 构造Redis缓存的key，使用预定义的前缀CACHE_KEY_USER加上用户ID
            String key=CACHE_KEY_USER+user.getId();

            // 将查询到的完整用户信息存入Redis缓存中，以便后续的查询操作可以直接从缓存获取
            redisTemplate.opsForValue().set(key, user);
        }

        // 返回保存操作的结果，true表示成功，false表示失败
        return retValue;
    }


        /**
     * 根据ID获取用户信息
     *
     * @param id 用户ID，用于标识唯一用户
     * @return 返回对应ID的用户对象，如果不存在则返回null
     *
     * 该方法使用Redis缓存注解，以"user:"作为缓存键前缀，
     * 通过匹配参数id的值来缓存和获取数据
     */
    @Override
    @MyRedisCache(keyPrefix = "user", matchValue = "#id")
    public User getById(Serializable id) {
        return super.getById(id);
    }

}




